{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "secondary-copying",
   "metadata": {},
   "source": [
    "# Torch Connector and Hybrid QNNs\n",
    "\n",
    "This tutorial introduces the `TorchConnector` class, and demonstrates how it allows for a natural integration of any `NeuralNetwork` from Qiskit Machine Learning into a PyTorch workflow. `TorchConnector` takes a `NeuralNetwork` and makes it available as a PyTorch `Module`. The resulting module can be seamlessly incorporated into PyTorch classical architectures and trained jointly without additional considerations, enabling the development and testing of novel **hybrid quantum-classical** machine learning architectures.\n",
    "\n",
    "## Content:\n",
    "\n",
    "[Part 1: Simple Classification & Regression](#Part-1:-Simple-Classification-&-Regression)\n",
    "\n",
    "The first part of this tutorial shows how quantum neural networks can be trained using PyTorch's automatic differentiation engine (`torch.autograd`, [link](https://pytorch.org/tutorials/beginner/blitz/autograd_tutorial.html)) for simple classification and regression tasks. \n",
    "\n",
    "1. [Classification](#1.-Classification)\n",
    "    1. Classification with PyTorch and `EstimatorQNN`\n",
    "    2. Classification with PyTorch and `SamplerQNN`\n",
    "2. [Regression](#2.-Regression)\n",
    "    1. Regression with PyTorch and `EstimatorQNN`\n",
    "\n",
    "[Part 2: MNIST Classification, Hybrid QNNs](#Part-2:-MNIST-Classification,-Hybrid-QNNs)\n",
    "\n",
    "The second part of this tutorial illustrates how to embed a (Quantum) `NeuralNetwork` into a target PyTorch workflow (in this case, a typical CNN architecture) to classify MNIST data in a hybrid quantum-classical manner.\n",
    "\n",
    "***"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "banned-helicopter",
   "metadata": {},
   "outputs": [],
   "source": [
    "# Necessary imports\n",
    "\n",
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n",
    "\n",
    "from torch import Tensor\n",
    "from torch.nn import Linear, CrossEntropyLoss, MSELoss\n",
    "from torch.optim import LBFGS\n",
    "\n",
    "from qiskit import QuantumCircuit\n",
    "from qiskit.circuit import Parameter\n",
    "from qiskit.circuit.library import real_amplitudes, zz_feature_map\n",
    "from qiskit_machine_learning.utils import algorithm_globals\n",
    "from qiskit_machine_learning.neural_networks import SamplerQNN, EstimatorQNN\n",
    "from qiskit_machine_learning.connectors import TorchConnector\n",
    "\n",
    "# Set seed for random generators\n",
    "algorithm_globals.random_seed = 42"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "unique-snapshot",
   "metadata": {},
   "source": [
    "## Part 1: Simple Classification & Regression"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "surgical-penetration",
   "metadata": {},
   "source": [
    "### 1. Classification\n",
    "\n",
    "First, we show how `TorchConnector` allows to train a Quantum `NeuralNetwork` to solve a classification tasks using PyTorch's automatic differentiation engine. In order to illustrate this, we will perform **binary classification** on a randomly generated dataset."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "secure-tragedy",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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c+fGenxUVJT89ddfTvs+//xzGTdunLkfXenVNDpFCrM2SMOGDaOP0wBKJ3wlBGtRAQA8QevklClTxvxcvnx5WbBggRQrVszqZvksr1iL6sCBA7JixQr54osvpHLlylK9enWZPHmy6WmJq8S1dudp1Ot4Wbx4sakzYA9uHAMax+MSGtwAAOApTz31lCxbtkxy5Mghu3btMkHOwoULrW5WQHBbgLN582YThOiscjutF6DjkFruOiF27txplqrXoa2Y3njjDcmZM6dUqlTJLIb2sI4o7RbUqM/xAgCAJzRu3Nh8lukX/StXrkjr1q3ltddekxs3bljdNL/mtgDnzJkzkjt37geKImXPnt3clhAzZsyQxx9/XKpVq+a0f9SoUSYC1hVdW7RoIa+//rrpHYrLmDFjTJeW/RISEpLEswIAIPGCg4Nl7dq1MmzYMDPNQqduaODjxlkiAS/RAc6QIUPinAhsvxw8eDDZDdPIVufqxNZ7M3z4cHnmmWekXLlypjz2oEGDzDyduAwdOtSM19kvERERyW4fAACJoV/y33vvPTN9QzsANKXcvuwDvCBNXIsXderUKd56ADovRpeVd3T37l2TWeU4uzwuixYtkuvXr0uHDh3iPVbn+IwePdoMRaVNm/aB23VfbPsBAPC0+vXry9GjR53mlur8HF2xPEOGDJa2LaADnFy5cplLfKpWrSqXLl0y82gqVKhg9q1Zs8bUA9CAJCHDU1oNMiH/l45tZsuWjSAGAOATHIMbHVV49tlnJV++fGb6RalSpSxtm79w2xwcnTujadzdunWTbdu2mQqPWgugTZs2kj9/fnOMLjGvEave7ujIkSOybt066dq16wP3q2t8aGbWvn37zHFTp06V999/39QYAADA12hmsRYJ3L9/vymlMmvWLKub5BfcWuhvzpw5JoCpW7euWU5eZ5BrXRs7rY1z6NAhMxTlSLOidEKWduPFlDp1apkyZYrpIdJFzXSi1vjx42XkyJHuPBUAANxCRzV0JEIzjfXzUGvGdezY8aGFcWFxoT9vRaE/AIC30SkcmvU7YsQI87N2EGhhQK2lAy8q9AcAABJO68T9+9//NunkOpVDM5J1lAJJQ4ADAIAXqVmzphmy0rmlH330kdXN8VkEOAAAeBnNIP74448lffr00Ws1vvrqq7J7926rm+YzCHAAAPByGuxokk6VKlXk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",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# Generate random dataset\n",
    "\n",
    "# Select dataset dimension (num_inputs) and size (num_samples)\n",
    "num_inputs = 2\n",
    "num_samples = 20\n",
    "\n",
    "# Generate random input coordinates (X) and binary labels (y)\n",
    "X = 2 * algorithm_globals.random.random([num_samples, num_inputs]) - 1\n",
    "y01 = 1 * (np.sum(X, axis=1) >= 0)  # in { 0,  1}, y01 will be used for SamplerQNN example\n",
    "y = 2 * y01 - 1  # in {-1, +1}, y will be used for EstimatorQNN example\n",
    "\n",
    "# Convert to torch Tensors\n",
    "X_ = Tensor(X)\n",
    "y01_ = Tensor(y01).reshape(len(y)).long()\n",
    "y_ = Tensor(y).reshape(len(y), 1)\n",
    "\n",
    "# Plot dataset\n",
    "for x, y_target in zip(X, y):\n",
    "    if y_target == 1:\n",
    "        plt.plot(x[0], x[1], \"bo\")\n",
    "    else:\n",
    "        plt.plot(x[0], x[1], \"go\")\n",
    "plt.plot([-1, 1], [1, -1], \"--\", color=\"black\")\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "hazardous-rehabilitation",
   "metadata": {},
   "source": [
    "#### A. Classification with PyTorch and  `EstimatorQNN`\n",
    "\n",
    "Linking an `EstimatorQNN` to PyTorch is relatively straightforward. Here we illustrate this by using the `EstimatorQNN` constructed from a feature map and an ansatz."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "fewer-desperate",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 1875.91x200.667 with 1 Axes>"
      ]
     },
     "execution_count": 3,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# Set up a circuit\n",
    "feature_map = zz_feature_map(num_inputs)\n",
    "ansatz = real_amplitudes(num_inputs)\n",
    "qc = QuantumCircuit(num_inputs)\n",
    "qc.compose(feature_map, inplace=True)\n",
    "qc.compose(ansatz, inplace=True)\n",
    "qc.draw(output=\"mpl\", style=\"clifford\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "humanitarian-flavor",
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "No gradient function provided, creating a gradient function. If your Estimator requires transpilation, please provide a pass manager.\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Initial weights:  [-0.01256962  0.06653564  0.04005302 -0.03752667  0.06645196  0.06095287\n",
      " -0.02250432 -0.04233438]\n"
     ]
    }
   ],
   "source": [
    "from qiskit.primitives import StatevectorEstimator as Estimator\n",
    "\n",
    "estimator = Estimator()\n",
    "# Setup QNN\n",
    "qnn1 = EstimatorQNN(\n",
    "    circuit=qc,\n",
    "    input_params=feature_map.parameters,\n",
    "    weight_params=ansatz.parameters,\n",
    "    estimator=estimator,\n",
    ")\n",
    "\n",
    "# Set up PyTorch module\n",
    "# Note: If we don't explicitly declare the initial weights\n",
    "# they are chosen uniformly at random from [-1, 1].\n",
    "initial_weights = 0.1 * (2 * algorithm_globals.random.random(qnn1.num_weights) - 1)\n",
    "model1 = TorchConnector(qnn1, initial_weights=initial_weights)\n",
    "print(\"Initial weights: \", initial_weights)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "id": "likely-grace",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "tensor([-0.3622], grad_fn=<_TorchNNFunctionBackward>)"
      ]
     },
     "execution_count": 5,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# Test with a single input\n",
    "model1(X_[0, :])"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "gorgeous-segment",
   "metadata": {},
   "source": [
    "##### Optimizer\n",
    "The choice of optimizer for training any machine learning model can be crucial in determining the success of our training's outcome. When using `TorchConnector`, we get access to all of the optimizer algorithms defined in the [`torch.optim`] package ([link](https://pytorch.org/docs/stable/optim.html)). Some of the most famous algorithms used in popular machine learning architectures include *Adam*, *SGD*, or *Adagrad*. However, for this tutorial we will be using the L-BFGS algorithm (`torch.optim.LBFGS`), one of the most well know second-order optimization algorithms for numerical optimization. \n",
    "\n",
    "##### Loss Function\n",
    "As for the loss function, we can also take advantage of PyTorch's pre-defined modules from `torch.nn`, such as the [Cross-Entropy](https://pytorch.org/docs/stable/generated/torch.nn.CrossEntropyLoss.html) or [Mean Squared Error](https://pytorch.org/docs/stable/generated/torch.nn.MSELoss.html) losses.\n",
    "\n",
    "\n",
    "**💡 Clarification :** \n",
    "In classical machine learning, the general rule of thumb is to apply a Cross-Entropy loss to classification tasks, and MSE loss to regression tasks. However, this recommendation is given under the assumption that the output of the classification network is a class probability value in the $[0, 1]$ range (usually this is achieved  through a Softmax layer). Because the following example for `EstimatorQNN` does not include such layer, and we don't apply any mapping to the output (the following section shows an example of application of parity mapping with `SamplerQNN`s), the QNN's output can take any value in the range $[-1, 1]$. In case you were wondering, this is the reason why this particular example uses MSELoss for classification despite it not being the norm (but we encourage you to experiment with different loss functions and see how they can impact training results). "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "id": "following-extension",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "25.82598304748535\n",
      "22.892683029174805\n",
      "20.049589157104492\n",
      "19.539369583129883\n",
      "18.51407241821289\n",
      "19.23345375061035\n",
      "18.101131439208984\n",
      "17.418519973754883\n",
      "16.179433822631836\n",
      "15.799242973327637\n",
      "17.726085662841797\n",
      "15.42390251159668\n",
      "15.077062606811523\n",
      "15.169689178466797\n",
      "15.001008033752441\n",
      "15.011570930480957\n",
      "14.959190368652344\n",
      "15.103139877319336\n",
      "14.866881370544434\n",
      "14.976161003112793\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "tensor(25.8260, grad_fn=<MseLossBackward0>)"
      ]
     },
     "execution_count": 6,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# Define optimizer and loss\n",
    "optimizer = LBFGS(model1.parameters())\n",
    "f_loss = MSELoss(reduction=\"sum\")\n",
    "\n",
    "# Start training\n",
    "model1.train()  # set model to training mode\n",
    "\n",
    "\n",
    "# Note from (https://pytorch.org/docs/stable/optim.html):\n",
    "# Some optimization algorithms such as LBFGS need to\n",
    "# reevaluate the function multiple times, so you have to\n",
    "# pass in a closure that allows them to recompute your model.\n",
    "# The closure should clear the gradients, compute the loss,\n",
    "# and return it.\n",
    "def closure():\n",
    "    optimizer.zero_grad()  # Initialize/clear gradients\n",
    "    loss = f_loss(model1(X_), y_)  # Evaluate loss function\n",
    "    loss.backward()  # Backward pass\n",
    "    print(loss.item())  # Print loss\n",
    "    return loss\n",
    "\n",
    "\n",
    "# Run optimizer step4\n",
    "optimizer.step(closure)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "id": "efficient-bangkok",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Accuracy: 0.8\n"
     ]
    },
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# Evaluate model and compute accuracy\n",
    "model1.eval()\n",
    "y_predict = []\n",
    "for x, y_target in zip(X, y):\n",
    "    output = model1(Tensor(x))\n",
    "    y_predict += [np.sign(output.detach().numpy())[0]]\n",
    "\n",
    "print(\"Accuracy:\", sum(y_predict == y) / len(y))\n",
    "\n",
    "# Plot results\n",
    "# red == wrongly classified\n",
    "for x, y_target, y_p in zip(X, y, y_predict):\n",
    "    if y_target == 1:\n",
    "        plt.plot(x[0], x[1], \"bo\")\n",
    "    else:\n",
    "        plt.plot(x[0], x[1], \"go\")\n",
    "    if y_target != y_p:\n",
    "        plt.scatter(x[0], x[1], s=200, facecolors=\"none\", edgecolors=\"r\", linewidths=2)\n",
    "plt.plot([-1, 1], [1, -1], \"--\", color=\"black\")\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "abstract-parish",
   "metadata": {},
   "source": [
    "The red circles indicate wrongly classified data points."
   ]
  },
  {
   "cell_type": "markdown",
   "id": "typical-cross",
   "metadata": {},
   "source": [
    "#### B. Classification with PyTorch and `SamplerQNN`\n",
    "\n",
    "Linking a `SamplerQNN` to PyTorch requires a bit more attention than `EstimatorQNN`. Without the correct setup, backpropagation is not possible. \n",
    "\n",
    "In particular, we must make sure that we are returning a dense array of probabilities in the network's forward pass (`sparse=False`). This parameter is set up to `False` by default, so we just have to make sure that it has not been changed.\n",
    "\n",
    "**⚠️ Attention:** \n",
    "If we define a custom interpret function ( in the example: `parity`), we must remember to explicitly provide the desired output shape ( in the example: `2`). For more info on the initial parameter setup for `SamplerQNN`, please check out the [official qiskit documentation](https://qiskit-community.github.io/qiskit-machine-learning/stubs/qiskit_machine_learning.neural_networks.SamplerQNN.html)."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "id": "present-operator",
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "No gradient function provided, creating a gradient function. If your Sampler requires transpilation, please provide a pass manager.\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Initial weights:  [ 0.0364991  -0.0720495  -0.06001836 -0.09852755]\n"
     ]
    }
   ],
   "source": [
    "# Define feature map and ansatz\n",
    "feature_map = zz_feature_map(num_inputs)\n",
    "ansatz = real_amplitudes(num_inputs, entanglement=\"linear\", reps=1)\n",
    "\n",
    "# Define quantum circuit of num_qubits = input dim\n",
    "# Append feature map and ansatz\n",
    "qc = QuantumCircuit(num_inputs)\n",
    "qc.compose(feature_map, inplace=True)\n",
    "qc.compose(ansatz, inplace=True)\n",
    "\n",
    "from qiskit.primitives import StatevectorSampler as Sampler\n",
    "\n",
    "sampler = Sampler()\n",
    "\n",
    "# Define SamplerQNN and initial setup\n",
    "parity = lambda x: \"{:b}\".format(x).count(\"1\") % 2  # optional interpret function\n",
    "output_shape = 2  # parity = 0, 1\n",
    "qnn2 = SamplerQNN(\n",
    "    circuit=qc,\n",
    "    input_params=feature_map.parameters,\n",
    "    weight_params=ansatz.parameters,\n",
    "    interpret=parity,\n",
    "    output_shape=output_shape,\n",
    "    sampler=sampler,\n",
    ")\n",
    "\n",
    "# Set up PyTorch module\n",
    "# Reminder: If we don't explicitly declare the initial weights\n",
    "# they are chosen uniformly at random from [-1, 1].\n",
    "initial_weights = 0.1 * (2 * algorithm_globals.random.random(qnn2.num_weights) - 1)\n",
    "print(\"Initial weights: \", initial_weights)\n",
    "model2 = TorchConnector(qnn2, initial_weights)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "liquid-reviewer",
   "metadata": {},
   "source": [
    "For a reminder on optimizer and loss function choices, you can go back to [this section](#Optimizer)."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "id": "marked-harvest",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0.6951524615287781\n",
      "0.6961157917976379\n",
      "0.6977273225784302\n",
      "0.6677151322364807\n",
      "0.6630406379699707\n",
      "0.7149767875671387\n",
      "0.6417769193649292\n",
      "0.6660363078117371\n",
      "0.6397734880447388\n",
      "0.7038944959640503\n",
      "0.6813933253288269\n",
      "0.692933201789856\n",
      "0.6873833537101746\n",
      "0.6300238966941833\n",
      "0.6268974542617798\n",
      "0.6163737177848816\n",
      "0.6190429925918579\n",
      "0.6201701760292053\n",
      "0.6100262999534607\n",
      "0.6179153323173523\n"
     ]
    }
   ],
   "source": [
    "# Define model, optimizer, and loss\n",
    "optimizer = LBFGS(model2.parameters())\n",
    "f_loss = CrossEntropyLoss()  # Our output will be in the [0,1] range\n",
    "\n",
    "# Start training\n",
    "model2.train()\n",
    "\n",
    "\n",
    "# Define LBFGS closure method (explained in previous section)\n",
    "def closure():\n",
    "    optimizer.zero_grad(set_to_none=True)  # Initialize gradient\n",
    "    loss = f_loss(model2(X_), y01_)  # Calculate loss\n",
    "    loss.backward()  # Backward pass\n",
    "\n",
    "    print(loss.item())  # Print loss\n",
    "    return loss\n",
    "\n",
    "\n",
    "# Run optimizer (LBFGS requires closure)\n",
    "optimizer.step(closure);"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "id": "falling-electronics",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Accuracy: 0.8\n"
     ]
    },
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# Evaluate model and compute accuracy\n",
    "model2.eval()\n",
    "y_predict = []\n",
    "for x in X:\n",
    "    output = model2(Tensor(x))\n",
    "    y_predict += [np.argmax(output.detach().numpy())]\n",
    "\n",
    "print(\"Accuracy:\", sum(y_predict == y01) / len(y01))\n",
    "\n",
    "# plot results\n",
    "# red == wrongly classified\n",
    "for x, y_target, y_ in zip(X, y01, y_predict):\n",
    "    if y_target == 1:\n",
    "        plt.plot(x[0], x[1], \"bo\")\n",
    "    else:\n",
    "        plt.plot(x[0], x[1], \"go\")\n",
    "    if y_target != y_:\n",
    "        plt.scatter(x[0], x[1], s=200, facecolors=\"none\", edgecolors=\"r\", linewidths=2)\n",
    "plt.plot([-1, 1], [1, -1], \"--\", color=\"black\")\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "aboriginal-white",
   "metadata": {},
   "source": [
    "The red circles indicate wrongly classified data points."
   ]
  },
  {
   "cell_type": "markdown",
   "id": "scheduled-nicaragua",
   "metadata": {},
   "source": [
    "### 2. Regression \n",
    "\n",
    "We use a model based on the `EstimatorQNN` to also illustrate how to perform a regression task. The chosen dataset in this case is randomly generated following a sine wave. "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "id": "amateur-dubai",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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lr7++mvdeOONmj9/vibvKDiR07BhwzR48GBF0h57SPfc43oddezo9WgQ4ADGijfv6FO0X4Za926m0i9/J/3zNimqv18AwhO8DBw4UPfYC+YuloyK64orrthxfOihh6pmzZo68cQTtXDhQh1gpfFzsZmZ/v3773hsMy9paWmKjK5d3Y2Kp9jNJaQ2bf5+8PiT0rzvpH33lbL9bgFAYIOX6667TpdcckmB1zRo0CCWq7J69eoc57dt2xbbgWQfKyzLlzE//vhjnsFL+fLlY7fIyh20WBZmIVr70hEYedq8WbrttqxcKnJdAIQheKlWrVrstistW7bUunXr9MUXX6hp06axc++99562b9++IyApjDlz5sTubQYGBVi71r3oWMfp994rcCamUL1sEE0PPGBrvm4nW69eXo8GAJKbsHvwwQfrlFNO0eWXX67PPvtMH330kXr37q3zzjsvls9ili9frkaNGsU+bmxpaMiQIbGAZ/HixXrttdfUrVs3HXfccTrssMMSNdRwsKTmJ590LYEtA3N3e9kgelatkoYPd8d33SWVK+f1iAAg+UXqbNeQBSeWs3LaaafFtks/9thjOz5utV8sGTe+m6hcuXJ69913dfLJJ8c+z5aozjnnHL3++uuJHGY42NTJjTe64wEDpL/+Kn4vG2reRdOdd0pWRLJZM6lLF69HAwDeFKnzQmSK1OWXr9CwoZtGGTbMsqtzfNgmZdq23fU/M316tuRNRMeSJS7PpUcPfgAARLNIHTxg/Y6yd//NtSW90L1sCnkdQmb//aXx4wlcAPgewUvYXHCBm/a36X97F12cXjbkRkcv2RsAAoTgJWys6++DD7rjl192vY/+ZtuhLTUmv41Idt5K5Nh1iNBSY5MmrlbQb795PRoAKBSClzA65hhp7Fhp/nypcuWi97Kh3kt02PKitZf43/+sqZjXowGAQiF4CauePa0oT+F72dRx56nzEiELFkj33ZcVtVq7CQCIcm8j+MjUqdLxx++o27FTLxsq7EaPbTK0ffNbt0qnnCKddZbXIwKAQiN4CTvb9jpunOs6na1PTY5eNogeq5301ltS2bJuLZHeWAAChGWjsItn31pn4F9+8Xo08IM//3SzLua666SDDvJ6RABQJAQvYde9u9s6vWGDK58LLFxoXVJdotMtt3g9GgAoMoKXsLP1IWvJYPcvvST9979ejwhea9xYmjdPeuMNV9gQAAKG4CUKrI7Htde642uucbU9EG0WtBx+uNejAIBiIXiJin//W6pbV/r5Z5f/guiZNs11Ht++3euRAMBuIXiJ0jvtRx+VGjSQTjzR69Eg2bZskXr1cvV/rKYLAAQYW6Wj5LTTpHbtdtR7QYRYy4gffpCqV5cuu8zr0QDAbmHmJWqyBy7p6V6OBMli5f+HDHHH994r7aLVPAD4HcFLFGVkSI88Ih1wALVfolBJ94orpD/+cD2vLrrI6xEBwG4jeImqZ5+Vli3LKlaGcLLqylZJt3x516yTSroAQoDgJYqs5suYMe7eujFavQ+Ej22Jv+EGd3zHHVKjRl6PCABKBMFLVFmNj3ivI2q/hHeH2ZtvSt265ehrBQBBR/ASZbff7mq/LFni6sAgfKw1xPjxUhk2FgIID4KXKIvXfolvpZ0zx+sRoSSsWCF9953XowCAhCF4iTqr/dK1qzv++GOvR4OS2F105ZXSkUdKTz/t9WgAICEIXuAqrn7+uXT11V6PBLtrwgTp9dddEGMBDACEEAvhkGrWdDcE28qVUp8+WflM1j0aAEKImRfkZLkSnTpJmzZ5PRIUhc20WO+i3393My4DBng9IgBIGIIX5Ky8e/bZ0iuvSP365Tg9Y4b0/PPu3h7DZ154QXr1ValsWempp9w9AIQUwQuyWNG6xx5zVVifeEKaPNn+p3r1pLZtpQsucPf22M7DJ379Verd2x3feqt02GFejwgAEorgBTm1abNjyWFy9ynq3Dkz1kUgu+XLpc6dCWB8o3Jl99+sZUtp4ECvRwMACZeSmWmL5eGxYcMGpaamav369apE99ziSU9XRotjVO/LyVqmOvZjstMlNjlTp460aJGbsIEPbN8uleL9CIDwv37zlw47K1dOM/u9rGVKyzNwMRbyLl0qzZyZ9NEhbvHinInVBC4AIoK/dsjTirL7F+66FQkfCvJivajOOMOV/1+wwOvRAEBSEbwgT4Ut+0J5GA+3Rdu29nXrJJZHAUQMwQvy1Lq1y2mx3Ja82Pm0NHcdkmzsWOmZZ9wy0cSJUo0aXo8IAJKK4AV5siTchx5yx7kDmPhj6ypAsm6SzZ6dVUX3rruk44/3ekQAkHQEL8iXFdqdNEmqXTvn+To1M2Ln7eNIIlsisj3qW7ZIZ54p3XCD1yMCAE8QvKBAFqDYppbpb23RhDo3aLraaFG9tup0+havhxY911/v9qZblcDx49ldBCCy+OuHXbKloTbty+v8qT3VJnWOSn88U7riCpc4iuS5806pfXvppZdcYToAiCiCFxReo0buhdOimaeflu691+sRRYsl5r71lnTUUV6PBAA8RfCCojnpJJepa6wU/WuveT2icFu92iUeAQB2IHhB0V1zjaszYvVF9tjD69GEl7Xvtm6YXbpI99zj9WgAwDcIXlB0tlfa9lF/+aWbiUFi3HyzNG2aVLGi210EAIgheEHxlC0r1a+f9finn9wWXpQMW5qLz7Y89ph0yCFejwgAfIPgBbvvvfekpk2lK69kB1JJsOq5116btcPowgu9HhEA+ArBC3bftm3Sxo2u9sh993k9mmD773+lHj3ccd++0k03eT0iAPAdghfsvpNPlh580B3feKP0+utejyi4fvzRJepedJH0wAP5N5cCgAgjeEHJ6N07a9nIdsjMmeP1iILJZluslsuTT1JBFwDywV9HlAybIRg5UmrbVtq0STrxRNdEELu2ZIm0fn3WY6uiawnRAIA8Ebyg5NgL7uTJ0tFHS2vXZhWzQ/5WrZJOOEFq08YdAwB2ieAFJWuffaSpU1313ccf93o0/mazLaecIi1c6I63b/d6RAAQCAQvKHlWeXfYMKl8effY8mDmzfN6VP7y55/SWWe53KDq1V3AV7Om16MCgEAgeEFiWeDSv790xBHSO+94PRp/sJygc86RPvjABXqWoHvAAV6PCgACg+AFia8BY9t///rLlbh/4w1F2vLlUuvW0ptvShUquG3lTZp4PSoACBSCFyQ+iffll6VOnaT0dHdvSb1RVbq0S2auVs1VJj7uOK9HBACBQ/CCxCtXTpo4UTrvPGnrVqlrV/c4imrUcFV0P/1UatnS69EAQCARvCB5MzDPPit17+4qyFq/HmsnEIWcH2uZ8NxzWecaN87Z1BIAUCRlinY5sJtLJlY51mZibBu1LZ2Emc0yXX21NHas+56bN5cOPNDrUQFA4DHzguSykvdjxkjvviuddlrW+Q0bFCq//y6deqoLXKz68PDh7CgCgBJC8ILksxdzax+QvTy+vbAPGeKWlALKhj5jhvT8iFWacXhfZUybLu25p/Taa65nEU0WAaBEELzAexMmSGvWSLfd5krlL12qoLENVPXqudZOF1xbXW2XPq16pZdq8h3f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",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# Generate random dataset\n",
    "\n",
    "num_samples = 20\n",
    "eps = 0.2\n",
    "lb, ub = -np.pi, np.pi\n",
    "f = lambda x: np.sin(x)\n",
    "\n",
    "X = (ub - lb) * algorithm_globals.random.random([num_samples, 1]) + lb\n",
    "y = f(X) + eps * (2 * algorithm_globals.random.random([num_samples, 1]) - 1)\n",
    "plt.plot(np.linspace(lb, ub), f(np.linspace(lb, ub)), \"r--\")\n",
    "plt.plot(X, y, \"bo\")\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "protected-genre",
   "metadata": {},
   "source": [
    "#### A. Regression with PyTorch and `EstimatorQNN`"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "lovely-semiconductor",
   "metadata": {},
   "source": [
    "The network definition and training loop will be analogous to those of the classification task using `EstimatorQNN`. In this case, we define our own feature map and ansatz, but let's do it a little different."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "id": "brazilian-adapter",
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "No gradient function provided, creating a gradient function. If your Estimator requires transpilation, please provide a pass manager.\n"
     ]
    }
   ],
   "source": [
    "# Construct simple feature map\n",
    "param_x = Parameter(\"x\")\n",
    "feature_map = QuantumCircuit(1, name=\"fm\")\n",
    "feature_map.ry(param_x, 0)\n",
    "\n",
    "# Construct simple parameterized ansatz\n",
    "param_y = Parameter(\"y\")\n",
    "ansatz = QuantumCircuit(1, name=\"vf\")\n",
    "ansatz.ry(param_y, 0)\n",
    "\n",
    "qc = QuantumCircuit(1)\n",
    "qc.compose(feature_map, inplace=True)\n",
    "qc.compose(ansatz, inplace=True)\n",
    "\n",
    "# Construct QNN\n",
    "qnn3 = EstimatorQNN(\n",
    "    circuit=qc, input_params=[param_x], weight_params=[param_y], estimator=estimator\n",
    ")\n",
    "\n",
    "# Set up PyTorch module\n",
    "# Reminder: If we don't explicitly declare the initial weights\n",
    "# they are chosen uniformly at random from [-1, 1].\n",
    "initial_weights = 0.1 * (2 * algorithm_globals.random.random(qnn3.num_weights) - 1)\n",
    "model3 = TorchConnector(qnn3, initial_weights)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "waiting-competition",
   "metadata": {},
   "source": [
    "For a reminder on optimizer and loss function choices, you can go back to [this section](#Optimizer)."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "id": "bibliographic-consciousness",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "14.860793113708496\n",
      "2.8230209350585938\n",
      "7.042710781097412\n",
      "0.3848305344581604\n",
      "0.2686576545238495\n",
      "0.24815842509269714\n",
      "0.2503661811351776\n",
      "0.24734418094158173\n",
      "0.2409782111644745\n",
      "0.2307329922914505\n",
      "0.2188606560230255\n",
      "0.2429036796092987\n",
      "0.25860416889190674\n",
      "0.25141140818595886\n",
      "0.22874575853347778\n",
      "0.22979310154914856\n",
      "0.2469615340232849\n",
      "0.24698731303215027\n",
      "0.24962764978408813\n",
      "0.2741272747516632\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "tensor(14.8608, grad_fn=<MseLossBackward0>)"
      ]
     },
     "execution_count": 13,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# Define optimizer and loss function\n",
    "optimizer = LBFGS(model3.parameters())\n",
    "f_loss = MSELoss(reduction=\"sum\")\n",
    "\n",
    "# Start training\n",
    "model3.train()  # set model to training mode\n",
    "\n",
    "\n",
    "# Define objective function\n",
    "def closure():\n",
    "    optimizer.zero_grad(set_to_none=True)  # Initialize gradient\n",
    "    loss = f_loss(model3(Tensor(X)), Tensor(y))  # Compute batch loss\n",
    "    loss.backward()  # Backward pass\n",
    "    print(loss.item())  # Print loss\n",
    "    return loss\n",
    "\n",
    "\n",
    "# Run optimizer\n",
    "optimizer.step(closure)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "id": "timely-happiness",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# Plot target function\n",
    "plt.plot(np.linspace(lb, ub), f(np.linspace(lb, ub)), \"r--\")\n",
    "\n",
    "# Plot data\n",
    "plt.plot(X, y, \"bo\")\n",
    "\n",
    "# Plot fitted line\n",
    "model3.eval()\n",
    "y_ = []\n",
    "for x in np.linspace(lb, ub):\n",
    "    output = model3(Tensor([x]))\n",
    "    y_ += [output.detach().numpy()[0]]\n",
    "plt.plot(np.linspace(lb, ub), y_, \"g-\")\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "individual-georgia",
   "metadata": {},
   "source": [
    "***\n",
    "\n",
    "## Part 2: MNIST Classification, Hybrid QNNs\n",
    "\n",
    "In this second part, we show how to leverage a hybrid quantum-classical neural network using `TorchConnector`, to perform a more complex image classification task on the MNIST handwritten digits dataset. \n",
    "\n",
    "For a more detailed (pre-`TorchConnector`) explanation on hybrid quantum-classical neural networks, you can check out the corresponding section in the [Qiskit Textbook repository](https://github.com/Qiskit/platypus/blob/main/notebooks/v2/ch-machine-learning/machine-learning-qiskit-pytorch.ipynb)."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "id": "otherwise-military",
   "metadata": {},
   "outputs": [],
   "source": [
    "# Additional torch-related imports\n",
    "import torch\n",
    "from torch import cat, no_grad, manual_seed\n",
    "from torch.utils.data import DataLoader\n",
    "from torchvision import datasets, transforms\n",
    "import torch.optim as optim\n",
    "from torch.nn import (\n",
    "    Module,\n",
    "    Conv2d,\n",
    "    Linear,\n",
    "    Dropout2d,\n",
    "    NLLLoss,\n",
    "    MaxPool2d,\n",
    "    Flatten,\n",
    "    Sequential,\n",
    "    ReLU,\n",
    ")\n",
    "import torch.nn.functional as F"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "bronze-encounter",
   "metadata": {},
   "source": [
    "### Step 1: Defining Data-loaders for train and test"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "parliamentary-middle",
   "metadata": {},
   "source": [
    "We take advantage of the `torchvision` [API](https://pytorch.org/vision/stable/datasets.html) to directly load a subset of the [MNIST dataset](https://en.wikipedia.org/wiki/MNIST_database) and define torch `DataLoader`s ([link](https://pytorch.org/docs/stable/data.html)) for train and test."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "id": "worthy-charlotte",
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "100%|█████████████████████████████████████████████████████████████████████████████| 9.91M/9.91M [00:03<00:00, 2.68MB/s]\n",
      "100%|█████████████████████████████████████████████████████████████████████████████| 28.9k/28.9k [00:00<00:00, 1.84MB/s]\n",
      "100%|█████████████████████████████████████████████████████████████████████████████| 1.65M/1.65M [00:00<00:00, 2.81MB/s]\n",
      "100%|█████████████████████████████████████████████████████████████████████████████████████| 4.54k/4.54k [00:00<?, ?B/s]\n"
     ]
    }
   ],
   "source": [
    "# Train Dataset\n",
    "# -------------\n",
    "\n",
    "# Set train shuffle seed (for reproducibility)\n",
    "manual_seed(42)\n",
    "\n",
    "batch_size = 1\n",
    "n_samples = 100  # We will concentrate on the first 100 samples\n",
    "\n",
    "# Use pre-defined torchvision function to load MNIST train data\n",
    "X_train = datasets.MNIST(\n",
    "    root=\"./data\", train=True, download=True, transform=transforms.Compose([transforms.ToTensor()])\n",
    ")\n",
    "\n",
    "# Filter out labels (originally 0-9), leaving only labels 0 and 1\n",
    "idx = np.append(\n",
    "    np.where(X_train.targets == 0)[0][:n_samples], np.where(X_train.targets == 1)[0][:n_samples]\n",
    ")\n",
    "X_train.data = X_train.data[idx]\n",
    "X_train.targets = X_train.targets[idx]\n",
    "\n",
    "# Define torch dataloader with filtered data\n",
    "train_loader = DataLoader(X_train, batch_size=batch_size, shuffle=True)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "completed-spring",
   "metadata": {},
   "source": [
    "If we perform a quick visualization we can see that the train dataset consists of images of handwritten 0s and 1s."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "id": "medieval-bibliography",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 1000x300 with 6 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "n_samples_show = 6\n",
    "\n",
    "data_iter = iter(train_loader)\n",
    "fig, axes = plt.subplots(nrows=1, ncols=n_samples_show, figsize=(10, 3))\n",
    "\n",
    "while n_samples_show > 0:\n",
    "    images, targets = data_iter.__next__()\n",
    "\n",
    "    axes[n_samples_show - 1].imshow(images[0, 0].numpy().squeeze(), cmap=\"gray\")\n",
    "    axes[n_samples_show - 1].set_xticks([])\n",
    "    axes[n_samples_show - 1].set_yticks([])\n",
    "    axes[n_samples_show - 1].set_title(\"Labeled: {}\".format(targets[0].item()))\n",
    "\n",
    "    n_samples_show -= 1"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "id": "structural-chuck",
   "metadata": {},
   "outputs": [],
   "source": [
    "# Test Dataset\n",
    "# -------------\n",
    "\n",
    "# Set test shuffle seed (for reproducibility)\n",
    "# manual_seed(5)\n",
    "\n",
    "n_samples = 50\n",
    "\n",
    "# Use pre-defined torchvision function to load MNIST test data\n",
    "X_test = datasets.MNIST(\n",
    "    root=\"./data\", train=False, download=True, transform=transforms.Compose([transforms.ToTensor()])\n",
    ")\n",
    "\n",
    "# Filter out labels (originally 0-9), leaving only labels 0 and 1\n",
    "idx = np.append(\n",
    "    np.where(X_test.targets == 0)[0][:n_samples], np.where(X_test.targets == 1)[0][:n_samples]\n",
    ")\n",
    "X_test.data = X_test.data[idx]\n",
    "X_test.targets = X_test.targets[idx]\n",
    "\n",
    "# Define torch dataloader with filtered data\n",
    "test_loader = DataLoader(X_test, batch_size=batch_size, shuffle=True)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "abroad-morris",
   "metadata": {},
   "source": [
    "### Step 2: Defining the QNN and Hybrid Model"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "super-tokyo",
   "metadata": {},
   "source": [
    "This second step shows the power of the `TorchConnector`. After defining our quantum neural network layer (in this case, a `EstimatorQNN`), we can embed it into a layer in our torch `Module` by initializing a torch connector as `TorchConnector(qnn)`.\n",
    "\n",
    "**⚠️ Attention:**\n",
    "In order to have an adequate gradient backpropagation in hybrid models,  we MUST set the initial parameter `input_gradients` to TRUE during the qnn initialization."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "id": "urban-purse",
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "No gradient function provided, creating a gradient function. If your Estimator requires transpilation, please provide a pass manager.\n"
     ]
    }
   ],
   "source": [
    "# Define and create QNN\n",
    "def create_qnn():\n",
    "    feature_map = zz_feature_map(2)\n",
    "    ansatz = real_amplitudes(2, reps=1)\n",
    "    qc = QuantumCircuit(2)\n",
    "    qc.compose(feature_map, inplace=True)\n",
    "    qc.compose(ansatz, inplace=True)\n",
    "\n",
    "    # REMEMBER TO SET input_gradients=True FOR ENABLING HYBRID GRADIENT BACKPROP\n",
    "    qnn = EstimatorQNN(\n",
    "        circuit=qc,\n",
    "        input_params=feature_map.parameters,\n",
    "        weight_params=ansatz.parameters,\n",
    "        input_gradients=True,\n",
    "        estimator=estimator,\n",
    "    )\n",
    "    return qnn\n",
    "\n",
    "\n",
    "qnn4 = create_qnn()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "id": "exclusive-productivity",
   "metadata": {},
   "outputs": [],
   "source": [
    "# Define torch NN module\n",
    "\n",
    "\n",
    "class Net(Module):\n",
    "    def __init__(self, qnn):\n",
    "        super().__init__()\n",
    "        self.conv1 = Conv2d(1, 2, kernel_size=5)\n",
    "        self.conv2 = Conv2d(2, 16, kernel_size=5)\n",
    "        self.dropout = Dropout2d()\n",
    "        self.fc1 = Linear(256, 64)\n",
    "        self.fc2 = Linear(64, 2)  # 2-dimensional input to QNN\n",
    "        self.qnn = TorchConnector(qnn)  # Apply torch connector, weights chosen\n",
    "        # uniformly at random from interval [-1,1].\n",
    "        self.fc3 = Linear(1, 1)  # 1-dimensional output from QNN\n",
    "\n",
    "    def forward(self, x):\n",
    "        x = F.relu(self.conv1(x))\n",
    "        x = F.max_pool2d(x, 2)\n",
    "        x = F.relu(self.conv2(x))\n",
    "        x = F.max_pool2d(x, 2)\n",
    "        x = self.dropout(x)\n",
    "        x = x.view(x.shape[0], -1)\n",
    "        x = F.relu(self.fc1(x))\n",
    "        x = self.fc2(x)\n",
    "        x = self.qnn(x)  # apply QNN\n",
    "        x = self.fc3(x)\n",
    "        return cat((x, 1 - x), -1)\n",
    "\n",
    "\n",
    "model4 = Net(qnn4)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "academic-specific",
   "metadata": {},
   "source": [
    "### Step 3: Training"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "id": "precious-career",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Training [10%]\tLoss: -1.1346\n",
      "Training [20%]\tLoss: -1.5417\n",
      "Training [30%]\tLoss: -1.7719\n",
      "Training [40%]\tLoss: -2.0305\n",
      "Training [50%]\tLoss: -2.2505\n",
      "Training [60%]\tLoss: -2.4415\n",
      "Training [70%]\tLoss: -2.6527\n",
      "Training [80%]\tLoss: -2.8458\n",
      "Training [90%]\tLoss: -3.0847\n",
      "Training [100%]\tLoss: -3.2644\n"
     ]
    }
   ],
   "source": [
    "# Define model, optimizer, and loss function\n",
    "optimizer = optim.Adam(model4.parameters(), lr=0.001)\n",
    "loss_func = NLLLoss()\n",
    "\n",
    "# Start training\n",
    "epochs = 10  # Set number of epochs\n",
    "loss_list = []  # Store loss history\n",
    "model4.train()  # Set model to training mode\n",
    "\n",
    "for epoch in range(epochs):\n",
    "    total_loss = []\n",
    "    for batch_idx, (data, target) in enumerate(train_loader):\n",
    "        optimizer.zero_grad(set_to_none=True)  # Initialize gradient\n",
    "        output = model4(data)  # Forward pass\n",
    "        loss = loss_func(output, target)  # Calculate loss\n",
    "        loss.backward()  # Backward pass\n",
    "        optimizer.step()  # Optimize weights\n",
    "        total_loss.append(loss.item())  # Store loss\n",
    "    loss_list.append(sum(total_loss) / len(total_loss))\n",
    "    print(\"Training [{:.0f}%]\\tLoss: {:.4f}\".format(100.0 * (epoch + 1) / epochs, loss_list[-1]))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "id": "spoken-stationery",
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# Plot loss convergence\n",
    "plt.plot(loss_list)\n",
    "plt.title(\"Hybrid NN Training Convergence\")\n",
    "plt.xlabel(\"Training Iterations\")\n",
    "plt.ylabel(\"Neg. Log Likelihood Loss\")\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "physical-closure",
   "metadata": {},
   "source": [
    "Now we'll save the trained model, just to show how a hybrid model can be saved and re-used later for inference. To save and load hybrid models, when using the TorchConnector, follow the PyTorch recommendations of saving and loading the models."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "id": "regulation-bread",
   "metadata": {},
   "outputs": [],
   "source": [
    "torch.save(model4.state_dict(), \"model4.pt\")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "pacific-flour",
   "metadata": {},
   "source": [
    "### Step 4: Evaluation"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "fabulous-tribe",
   "metadata": {},
   "source": [
    "We start from recreating the model and loading the state from the previously saved file. You create a QNN layer using another simulator or a real hardware. So, you can train a model on real hardware available on the cloud and then for inference use a simulator or vice verse. For a sake of simplicity we create a new quantum neural network in the same way as above."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "id": "prospective-flooring",
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "No gradient function provided, creating a gradient function. If your Estimator requires transpilation, please provide a pass manager.\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "<All keys matched successfully>"
      ]
     },
     "execution_count": 24,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "qnn5 = create_qnn()\n",
    "model5 = Net(qnn5)\n",
    "model5.load_state_dict(torch.load(\"model4.pt\"))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "id": "spectacular-conservative",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Performance on test data:\n",
      "\tLoss: -3.3232\n",
      "\tAccuracy: 100.0%\n"
     ]
    }
   ],
   "source": [
    "model5.eval()  # set model to evaluation mode\n",
    "with no_grad():\n",
    "\n",
    "    correct = 0\n",
    "    for batch_idx, (data, target) in enumerate(test_loader):\n",
    "        output = model5(data)\n",
    "        if len(output.shape) == 1:\n",
    "            output = output.reshape(1, *output.shape)\n",
    "\n",
    "        pred = output.argmax(dim=1, keepdim=True)\n",
    "        correct += pred.eq(target.view_as(pred)).sum().item()\n",
    "\n",
    "        loss = loss_func(output, target)\n",
    "        total_loss.append(loss.item())\n",
    "\n",
    "    print(\n",
    "        \"Performance on test data:\\n\\tLoss: {:.4f}\\n\\tAccuracy: {:.1f}%\".format(\n",
    "            sum(total_loss) / len(total_loss), correct / len(test_loader) / batch_size * 100\n",
    "        )\n",
    "    )"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "id": "color-brave",
   "metadata": {
    "tags": [
     "nbsphinx-thumbnail"
    ]
   },
   "outputs": [
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 1000x300 with 6 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# Plot predicted labels\n",
    "\n",
    "n_samples_show = 6\n",
    "count = 0\n",
    "fig, axes = plt.subplots(nrows=1, ncols=n_samples_show, figsize=(10, 3))\n",
    "\n",
    "model5.eval()\n",
    "with no_grad():\n",
    "    for batch_idx, (data, target) in enumerate(test_loader):\n",
    "        if count == n_samples_show:\n",
    "            break\n",
    "        output = model5(data[0:1])\n",
    "        if len(output.shape) == 1:\n",
    "            output = output.reshape(1, *output.shape)\n",
    "\n",
    "        pred = output.argmax(dim=1, keepdim=True)\n",
    "\n",
    "        axes[count].imshow(data[0].numpy().squeeze(), cmap=\"gray\")\n",
    "\n",
    "        axes[count].set_xticks([])\n",
    "        axes[count].set_yticks([])\n",
    "        axes[count].set_title(\"Predicted {}\".format(pred.item()))\n",
    "\n",
    "        count += 1"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "prompt-visibility",
   "metadata": {},
   "source": [
    "🎉🎉🎉🎉\n",
    "**You are now able to experiment with your own hybrid datasets and architectures using Qiskit Machine Learning.** \n",
    "**Good Luck!**"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "id": "related-wheat",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<h3>Version Information</h3><table><tr><th>Software</th><th>Version</th></tr><tr><td><code>qiskit</code></td><td>1.4.3</td></tr><tr><td><code>qiskit_machine_learning</code></td><td>0.9.0</td></tr><tr><th colspan='2'>System information</th></tr><tr><td>Python version</td><td>3.12.9</td></tr><tr><td>OS</td><td>Windows</td></tr><tr><td colspan='2'>Fri Jul 18 15:23:02 2025 Eastern Daylight Time</td></tr></table>"
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "<div style='width: 100%; background-color:#d5d9e0;padding-left: 10px; padding-bottom: 10px; padding-right: 10px; padding-top: 5px'><h3>This code is a part of a Qiskit project</h3><p>&copy; Copyright IBM 2017, 2025.</p><p>This code is licensed under the Apache License, Version 2.0. You may<br>obtain a copy of this license in the LICENSE.txt file in the root directory<br> of this source tree or at http://www.apache.org/licenses/LICENSE-2.0.<p>Any modifications or derivative works of this code must retain this<br>copyright notice, and modified files need to carry a notice indicating<br>that they have been altered from the originals.</p></div>"
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "import tutorial_magics\n",
    "\n",
    "%qiskit_version_table\n",
    "%qiskit_copyright"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.12.9"
  },
  "toc": {
   "base_numbering": 1,
   "nav_menu": {},
   "number_sections": true,
   "sideBar": true,
   "skip_h1_title": false,
   "title_cell": "Table of Contents",
   "title_sidebar": "Contents",
   "toc_cell": false,
   "toc_position": {},
   "toc_section_display": true,
   "toc_window_display": false
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
